home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockStreamHousekeeping.js < prev    next >
Text File  |  2007-10-18  |  6KB  |  224 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18.  
  19. const SHK_CONTRACTID = '@flock.com/stream-housekeeping;1';
  20. const SHK_CLASSID    = Components.ID('{c4a5d459-3644-4557-9cd6-a3a4cb09c59a}');
  21. const SHK_CLASSNAME  = 'Flock Stream Housekeeping';
  22.  
  23.  
  24. const CAP_RUN_INTERVAL     = 500;
  25. const CAP_SLEEP_INTERVAL   = 2000;
  26.  
  27. const DEFAULT_ITEM_CAP     = 100;
  28.  
  29.  
  30. const Cc = Components.classes;
  31. const Ci = Components.interfaces;
  32. const Cr = Components.results;
  33.  
  34.  
  35. function getIntPref(prefName, defaultValue) {
  36.   try {
  37.     var prefs = Cc['@mozilla.org/preferences-service;1']
  38.       .getService(Ci.nsIPrefBranch);
  39.     return prefs.getIntPref(prefName);
  40.   }
  41.   catch (e) {
  42.     return defaultValue;
  43.   }
  44. }
  45.  
  46.  
  47. function StreamHousekeeping() {
  48.   this._logger = Cc['@flock.com/logger;1'].createInstance(Ci.flockILogger);
  49.   this._logger.init('streamhousekeeping');
  50.   this._logger.info('starting up...');
  51.  
  52.   this._faves = Cc['@mozilla.org/rdf/datasource;1?name=flock-favorites']
  53.     .getService(Ci.nsIRDFDataSource);
  54.   this._coop = Cc["@flock.com/singleton;1"]
  55.                .getService(Ci.flockISingleton)
  56.                .getSingleton("chrome://flock/content/common/load-faves-coop.js")
  57.                .wrappedJSObject;
  58. }
  59.  
  60. StreamHousekeeping.prototype = {
  61.   runHousekeeping: function SHK_runHousekeeping() {
  62.     this._logger.info('running housekeeping...');
  63.     this._capItemsForAllObjects();
  64.   },
  65.  
  66.   capItemsForObject: function SHK_capItemsForObject(urn) {
  67.     var obj = this._coop.get(urn);
  68.     if (!obj || !obj.capItems)
  69.       return;
  70.  
  71.     var maxItems = obj.maxItems;
  72.     if (maxItems <= 0)
  73.       maxItems = DEFAULT_ITEM_CAP;
  74.  
  75.     var removeCount = obj.count - maxItems;
  76.     if (removeCount <= 0)
  77.       return;
  78.  
  79.     this._logger.info('Removing ' + removeCount + ' items from ' + urn);
  80.  
  81.     var itemsToRemove = [];
  82.  
  83.     var items = obj.children.enumerate();
  84.     while (items && items.hasMoreElements()) {
  85.       var item = items.getNext();
  86.       if (item && !item.flagged) {
  87.         itemsToRemove.push(item);
  88.         if (itemsToRemove.length >= removeCount)
  89.           break;
  90.       }
  91.     }
  92.  
  93.     for each (var item in itemsToRemove) {
  94.       this._logger.info('Removing ' + item.id());
  95.       obj.children.remove(item);
  96.       item.destroy();
  97.     }
  98.   },
  99.  
  100.   _capItemsForAllObjects: function SHK__capItemsForAllObjects() {
  101.     var RDFS = Cc['@mozilla.org/rdf/rdf-service;1']
  102.       .getService(Ci.nsIRDFService);
  103.     var capItems = RDFS.GetResource('http://flock.com/rdf#capItems');
  104.  
  105.     var objs = this._faves.GetSources(capItems, RDFS.GetLiteral('true'), true);
  106.  
  107.     var gc = this;
  108.  
  109.     var cap = {
  110.       notify: function(timer) {
  111.         var start = Date.now();
  112.  
  113.         while (objs.hasMoreElements()) {
  114.           var obj = objs.getNext().QueryInterface(Ci.nsIRDFResource);
  115.           gc.capItemsForObject(obj.Value);
  116.  
  117.           if (Date.now() > start + CAP_RUN_INTERVAL)
  118.             return;
  119.         }
  120.  
  121.         timer.cancel();
  122.       }
  123.     };
  124.  
  125.     var timer = Cc['@mozilla.org/timer;1'].createInstance(Ci.nsITimer);
  126.     timer.initWithCallback(cap, CAP_SLEEP_INTERVAL,
  127.                            Ci.nsITimer.TYPE_REPEATING_SLACK);
  128.   },
  129.  
  130.   getInterfaces: function SHK_getInterfaces(countRef) {
  131.     var interfaces = [Ci.flockIStreamHousekeeping, Ci.flockIHousekeeping,
  132.                       Ci.nsIClassInfo, Ci.nsISupports];
  133.     countRef.value = interfaces.length;
  134.     return interfaces;
  135.   },
  136.   getHelperForLanguage: function SHK_getHelperForLanguage(language) {
  137.     return null;
  138.   },
  139.   contractID: SHK_CONTRACTID,
  140.   classDescription: SHK_CLASSNAME,
  141.   classID: SHK_CLASSID,
  142.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  143.   flags: Ci.nsIClassInfo.SINGLETON,
  144.  
  145.   QueryInterface: function SHK_QueryInterface(iid) {
  146.     if (iid.equals(Ci.flockIStreamHousekeeping) ||
  147.         iid.equals(Ci.flockIHousekeeping) ||
  148.         iid.equals(Ci.nsIClassInfo) ||
  149.         iid.equals(Ci.nsISupports))
  150.       return this;
  151.     throw Cr.NS_ERROR_NO_INTERFACE;
  152.   }
  153. }
  154.  
  155.  
  156. function GenericComponentFactory(ctor) {
  157.   this._ctor = ctor;
  158. }
  159.  
  160. GenericComponentFactory.prototype = {
  161.  
  162.   _ctor: null,
  163.  
  164.   // nsIFactory
  165.   createInstance: function(outer, iid) {
  166.     if (outer != null)
  167.       throw Cr.NS_ERROR_NO_AGGREGATION;
  168.     return (new this._ctor()).QueryInterface(iid);
  169.   },
  170.  
  171.   // nsISupports
  172.   QueryInterface: function(iid) {
  173.     if (iid.equals(Ci.nsIFactory) ||
  174.         iid.equals(Ci.nsISupports))
  175.       return this;
  176.     throw Cr.NS_ERROR_NO_INTERFACE;
  177.   },
  178. };
  179.  
  180. var Module = {
  181.   QueryInterface: function(iid) {
  182.     if (iid.equals(Ci.nsIModule) ||
  183.         iid.equals(Ci.nsISupports))
  184.       return this;
  185.  
  186.     throw Cr.NS_ERROR_NO_INTERFACE;
  187.   },
  188.  
  189.   getClassObject: function(cm, cid, iid) {
  190.     if (!iid.equals(Ci.nsIFactory))
  191.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  192.  
  193.     if (cid.equals(SHK_CLASSID))
  194.       return new GenericComponentFactory(StreamHousekeeping)
  195.  
  196.     throw Cr.NS_ERROR_NO_INTERFACE;
  197.   },
  198.  
  199.   registerSelf: function(cm, file, location, type) {
  200.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  201.     cr.registerFactoryLocation(SHK_CLASSID, SHK_CLASSNAME, SHK_CONTRACTID,
  202.                                file, location, type);
  203.  
  204.     var catman = Cc['@mozilla.org/categorymanager;1']
  205.       .getService(Ci.nsICategoryManager);
  206.     catman.addCategoryEntry('flockHousekeeping', SHK_CLASSNAME, SHK_CONTRACTID,
  207.                             true, true);
  208.   },
  209.  
  210.   unregisterSelf: function(cm, location, type) {
  211.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  212.     cr.unregisterFactoryLocation(SHK_CLASSID, location);
  213.   },
  214.  
  215.   canUnload: function(cm) {
  216.     return true;
  217.   },
  218. };
  219.  
  220. function NSGetModule(compMgr, fileSpec)
  221. {
  222.   return Module;
  223. }
  224.